퍼센트 인코딩
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
퍼센트 인코딩은 URI에서 문자를 표현하는 방법으로, 예약된 문자를 특수 문자 시퀀스로 변환하여 사용한다. RFC 3986에 정의되어 있으며, URL에서 중요한 의미를 가지는 예약 문자와 퍼센트 인코딩을 할 필요가 없는 비예약 문자가 존재한다. URL의 경로, 사용자 정보, 비밀번호 등에서 특정 문자들은 UTF-8로 인코딩된 후 퍼센트 인코딩된다. HTML 폼 데이터는 application/x-www-form-urlencoded 미디어 유형으로 인코딩되어 전송되며, 비표준 인코딩 방식도 존재한다.
더 읽어볼만한 페이지
- URI 스킴 - HTTPS
HTTPS는 HTTP에 보안 기능이 더해진 통신 규약으로, 웹 브라우저와 서버 간 통신을 암호화하여 보안을 강화하지만, 인증서 비용, 서버 부하, 혼합 콘텐츠 문제 등의 단점도 존재한다. - URI 스킴 - 텔넷
텔넷은 1973년에 정의된 7비트 ASCII 문자 세트를 사용하는 네트워크 프로토콜로, 클라이언트-서버 방식으로 작동하며 TCP 포트 23 또는 2323을 사용하며, 보안 취약성으로 인해 SSH로 대체되고 있다. - 문자 인코딩 - 유니코드
유니코드는 세계의 모든 문자를 하나의 컴퓨터 인코딩 표준으로 통합하기 위해 설계되었으며, 유니코드 컨소시엄에 의해 관리되고 UTF-8, UTF-16, UTF-32 등의 부호화 형식을 제공하지만, 일부 문자 표현 문제, 버전 간 비호환성, 레거시 인코딩과의 호환성 문제 등의 과제를 안고 있다. - 문자 인코딩 - UTF-8
UTF-8은 유니코드 문자를 표현하는 가변 길이 문자 인코딩 방식으로, ASCII 코드와 호환성을 유지하며 다양한 언어의 문자를 표현할 수 있도록 설계되었지만, 보안 문제점과 공간 효율성 측면에서 단점을 가진다. - 인터넷 표준 - DNSSEC
DNSSEC는 DNS의 보안 취약점을 개선하기 위해 도메인 정보에 디지털 서명을 추가하여 응답 레코드의 무결성을 보장하고 DNS 위장 공격을 막는 기술로, RRSIG, DNSKEY 등 다양한 리소스 레코드 유형을 사용하여 인증 체인을 구성하며 공개 키 암호 방식을 활용한다. - 인터넷 표준 - IPv6
IPv6는 IPv4 주소 고갈 문제를 해결하고자 개발된 차세대 인터넷 프로토콜로, 128비트 주소 체계를 통해 사실상 무한대에 가까운 IP 주소를 제공하며, 주소 자동 설정, 패킷 처리 효율성 향상, 보안 기능 강화 등의 특징을 갖는다.
퍼센트 인코딩 |
---|
2. 규약
퍼센트 인코딩 규약은 RFC 3986에 정의되어 있다. 이 규정에 따르면 URI에서 특별한 의미를 가지는 '''예약'''(reserved) 문자와, 인코딩이 필요하지 않은 '''비예약'''(unreserved) 문자가 구분된다. 예약 문자는 URI 내에서 문법적으로 중요한 역할을 하므로, 해당 의미로 사용하지 않을 경우에는 반드시 퍼센트 인코딩을 해야 한다. 반면, 비예약 문자는 특별한 의미가 없어 인코딩할 필요가 없으며, 하지 않는 것이 권장된다.
URI에서 허용되는 문자는 이러한 예약 문자, 비예약 문자, 그리고 퍼센트 인코딩의 일부인 % 문자이다. 예약 문자와 비예약 문자의 구체적인 집합 및 특정 예약 문자의 의미는 URI 관련 표준이 개정되면서 조금씩 변경되어 왔다.
예약 문자나 비예약 문자가 아닌 다른 모든 문자는 URI에 포함시키기 위해 퍼센트 인코딩을 해야 한다. 특히 URL 표준에서는 URL의 경로(path) 부분을 처리할 때 특정 문자들을 UTF-8로 부호화한 뒤 퍼센트 인코딩하도록 규정하고 있다. 경로에서 퍼센트 인코딩 대상이 되는 문자(path percent-encode set)는 다음과 같다.
- C0 제어 퍼센트 인코딩 집합 (C0 control percent-encode set)
- C0 제어 문자 (U+0000 널 문자~U+001F)
- 코드 포인트 U+007E보다 큰 모든 문자
- U+0020 공백
- U+0022 큰따옴표 (
"
) - U+0023 # (
#
) - U+003C < (
<
) - U+003E > (
>
) - U+0060 백틱 (
`
) - U+007B 여는 중괄호 (
{
) - U+007D 닫는 중괄호 (
}
)
이 외에도 URL의 사용자 정보나 비밀번호 부분에서는 더 많은 문자가 퍼센트 인코딩 대상이 된다.[6]
퍼센트 인코딩은 바이트 단위로 처리되며, 각 바이트는 "%XX" 형식의 문자열로 변환된다. 여기서 XX는 해당 바이트 값을 나타내는 두 자리 16진법 숫자이다. 예를 들어, "위키백과"라는 문자열을 서로 다른 문자 인코딩 방식으로 퍼센트 인코딩하면 다음과 같은 결과가 나온다.
- Shift_JIS:
%83E%83B%83L%83y%83f%83B%83A
- EUC-JP:
%A5%A6%A5%A3%A5%AD%A5%DA%A5%C7%A5%A3%A5%A2
- UTF-8:
%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2
이러한 퍼센트 인코딩에 대한 정의는 URL 표준 등장 이전부터 RFC 3986 등에서 찾아볼 수 있다.
2. 1. 예약 문자
퍼센트 인코딩 규칙은 RFC 3986에 정의되어 있다. 이 문서에 따르면 URL과 같은 URI에서는 특별한 의미를 가지는 예약(reserved) 문자가 존재한다. 이러한 예약 문자는 URI 내에서 특별한 문법적 의미를 가지므로, 본래의 의미가 아닌 다른 용도로 사용하려면 반드시 퍼센트 인코딩을 해야 한다. 예를 들어, / 문자는 URL 경로의 각 부분을 구분하는 데 사용된다.RFC 3986 2.2절에서 정의한 예약 문자는 다음과 같다.
2. 2. 비예약 문자
RFC 3986에 따르면, URI에서 특별한 의미를 가지지 않아 퍼센트 인코딩이 필요하지 않은 '''비예약'''(unreserved) 문자가 있다. 이들 문자는 퍼센트 인코딩을 할 필요가 없고, 인코딩하지 않는 것을 권장한다.RFC 3986에서 정의한 비예약 문자는 다음과 같다.
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | - | . | _ | ~ | colspan="13" | |
퍼센트 인코딩 규약은 RFC 3986에 정의되어 있다. 이 규약에 따라 URI에서 사용되는 문자는 의미에 따라 예약(reserved) 문자와 비예약(unreserved) 문자로 나뉜다.
URI에서 허용되는 문자는 예약 문자, 비예약 문자, 그리고 퍼센트 문자(퍼센트 인코딩의 일부)이다. '비예약된' 문자는 '예약된' 문자와 달리 URI 내에서 특별한 문법적 의미를 가지지 않는다. 예약된 문자와 비예약된 문자의 집합과 특정 예약된 문자가 특별한 의미를 갖는 상황은 URI 및 URI 스키마를 규정하는 각 사양 개정판마다 약간씩 변경되었다.
3. URI에서의 퍼센트 인코딩
예약 문자는 URI 내에서 특별한 의미를 가질 수 있는 문자들이다. 예를 들어, 슬래시(/) 문자는 URL(또는 더 일반적으로는 URI)의 경로(path) 부분을 구분하는 데 사용된다. 만약 예약 문자를 원래의 특별한 의미가 아닌 일반 문자로 사용해야 할 경우에는 반드시 퍼센트 인코딩을 해야 한다.
반면, 비예약 문자는 특별한 의미를 가지지 않는 문자들이다. 이 문자들은 퍼센트 인코딩을 할 필요가 없으며, 인코딩하지 않는 것이 권장된다.
결론적으로 URI에서 허용되는 문자는 예약 문자, 비예약 문자, 그리고 퍼센트 인코딩 자체를 나타내는 퍼센트 문자(%) 뿐이다. 이 외의 모든 문자는 URI 내에서 사용되기 전에 반드시 퍼센트 인코딩 과정을 거쳐야 한다. 예약된 문자와 비예약된 문자의 정확한 집합 및 특정 예약 문자가 특별한 의미를 갖는 상황은 URI 및 URI 스키마를 규정하는 각 사양 개정판마다 약간씩 변경될 수 있다.
3. 1. 현재 표준
URI에서 허용되는 문자는 '예약된(reserved)' 문자 또는 '비예약된(unreserved)' 문자이거나 퍼센트 문자(%)이다. '예약된' 문자는 때때로 특별한 의미를 갖는 문자이다. 예를 들어, 슬래시 문자는 URL(또는 더 일반적으로는 URI)의 여러 부분을 구분하는 데 사용된다. '비예약된' 문자는 그러한 의미가 없다. 퍼센트 인코딩을 사용하면 예약된 문자는 특수한 문자열로 표현된다. 예약된 문자와 비예약된 문자의 집합, 그리고 특정 예약된 문자가 특별한 의미를 갖는 상황은 URI 및 URI 스키마를 규정하는 각 사양 개정판마다 조금씩 변경되었다.
현재 표준인 RFC 3986 (2005년 1월)에서는 예약된 문자와 비예약된 문자를 다음과 같이 정의한다.
! | # | $ | & | ' | ( | ) | * | + | , | / | : | ; | = | ? | @ | [ | ] |
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | - | . | _ | ~ | colspan="13" | |
URI에서 위의 예약된 문자 및 비예약된 문자를 제외한 다른 모든 문자는 퍼센트 인코딩되어야 한다.
일반적인 URI 구문은 새로운 URI 스키마를 만들 때, 비예약된 문자는 그대로 표현하고 다른 모든 문자는 UTF-8 인코딩 방식에 따라 바이트로 변환한 다음, 해당 바이트 값을 퍼센트 인코딩할 것을 권장한다. 이 권장 사항은 2005년 1월 RFC 3986의 발표와 함께 도입되었다. 따라서 이 날짜 이전에 만들어진 URI 스키마는 이 권장 사항의 영향을 받지 않는다.
다만 현재 표준 사양에서도 인코딩된 문자 데이터를 어떻게 처리해야 하는지에 대해서는 명확히 다루지 않고 있다. 예를 들어, 컴퓨터 시스템 내에서 문자 데이터는 특정 인코딩 형태로 존재하는데, 이를 URI 문자로 변환할 때 이진 데이터로 처리해야 할지, 아니면 문자 데이터로 처리해야 할지에 대한 명확한 지침이 부족하다. URI 스키마 사양에서 이를 고려하여 처리 방식을 지정하는 것이 바람직하지만, 실제로는 그런 경우가 드물다.
3. 2. 비표준 구현
유니코드 문자에 대한 비표준 인코딩 방식으로 `%u''xxxx''`가 존재한다. 여기서 ''xxxx''는 네 자리 16진수로 표현된 UTF-16 코드 유닛이다. 이러한 방식은 어떤 RFC 문서에도 명시되지 않았으며 W3C에 의해 거부되었다.[2] ECMA-262 13판에는 여전히 이 구문을 사용하는 `escape` 함수가 포함되어 있는데, 이 함수는 문자열에 UTF-8 인코딩을 적용한 다음, 그 결과 바이트를 퍼센트 인코딩한다.[3]4. application/x-www-form-urlencoded
HTML 폼에 입력된 데이터를 서버로 전송할 때, 필드 이름과 값은 특정 방식으로 인코딩된다. 이 인코딩된 데이터는 하이퍼텍스트 전송 프로토콜(HTTP)의 GET 또는 POST 메서드를 사용하거나, 과거에는 이메일을 통해 서버에 전달된다.[4]
이때 사용되는 기본 인코딩 방식은 초기 버전의 일반 URI 퍼센트 인코딩 규칙[5]을 기반으로 하지만, 몇 가지 수정 사항이 적용되었다. 예를 들어, 개행 문자는 정규화되고, 공백 문자는 %20
대신 +
기호로 변환된다. 이렇게 인코딩된 데이터의 미디어 유형은 application/x-www-form-urlencoded
로 지정되며, 이 방식은 현재 HTML 및 XForms 사양에 정의되어 있다. 또한 CGI 사양에는 웹 서버가 이 형식의 데이터를 어떻게 디코딩하여 애플리케이션에서 사용할 수 있는지에 대한 규칙이 포함되어 있다.
웹 폼의 문자열을 HTTP POST 메서드로 전송할 때 이 인코딩 방식이 사용되며, 이때 MIME의 Content-Type 헤더 값으로 application/x-www-form-urlencoded
가 명시된다. 이 인코딩 방식을 흔히 '''URL 인코딩'''이라고 부르기도 한다. 표준 문서로는 [https://datatracker.ietf.org/doc/html/rfc1866#section-8.2.1 RFC 1866 HTML 2.0의 Section-8.2.1]에서 처음 등장했다.
데이터 전송 방식에 따라 포함되는 위치가 다르다. HTTP GET 요청으로 전송될 경우, 인코딩된 데이터는 요청 URI의 쿼리 문자열 부분에 포함된다. 반면, HTTP POST 요청이나 이메일을 통해 전송될 때는 데이터가 메시지의 본문에 포함되며, 이때 Content-Type 헤더에 application/x-www-form-urlencoded
가 명시된다.
만약 여러 개의 폼 항목(필드 이름과 값 쌍)을 전송해야 하는 경우, 각 항목은 "&
"(앰퍼샌드) 문자로 구분되어 하나의 문자열로 합쳐진 후 전송된다.
5. URL 경로, 사용자 정보, 비밀번호에서의 인코딩 (일본어 문서 참고)
URL 표준에서는 URL의 경로 부분을 구문 분석할 때 특정 문자 집합(path percent-encode set)에 해당하는 문자를 만나면, 이를 UTF-8로 부호화한 뒤 퍼센트 인코딩하도록 규정하고 있다. 퍼센트 인코딩이란 바이트 열의 각 바이트를 "%XX" 형태의 문자열로 변환하는 것을 말하며, 여기서 XX는 해당 바이트 값을 나타내는 16진법 숫자이다.
URL의 사용자 정보나 비밀번호 부분에서는 경로 부분에서 요구하는 것보다 더 많은 문자가 퍼센트 인코딩 대상이 된다.[6]
퍼센트 인코딩에 대한 정의는 URL 표준이 등장하기 이전부터 존재했으며, 대표적으로 RFC 3986 등에서 관련 내용을 찾아볼 수 있다.
5. 1. 인코딩 대상 문자
URL 표준에서는 URL의 경로 부분 구문 분석 시, 다음 (path percent-encode set)에 해당하는 문자라면, UTF-8로 부호화하여 퍼센트 인코딩하도록 규정하고 있다. 퍼센트 인코딩은 바이트 열에 대해 각 바이트를 "%XX" (XX는 16진법)라는 문자열로 변환하는 것이다.- C0 제어 퍼센트 인코딩 집합 (C0 control percent-encode set)
- C0 제어 문자 (U+0000 널 문자~U+001F)
- 코드 포인트 값 U+007E보다 상위의 모든 문자
- U+0020 공백
- U+0022 큰따옴표 "
- U+0023 번호 기호 #
- U+003C 작음 <
- U+003E 큼 >
- U+0060 백틱 `
- U+007B 여는 중괄호 {
- U+007D 닫는 중괄호 }
이 외에도 URL의 사용자 정보, 비밀번호 부분에서는 더 많은 문자가 퍼센트 부호화의 대상이 된다.[6]
5. 2. 예시
"위키백과"라는 문자열을 각종 문자 코드를 사용하여 퍼센트 인코딩으로 인코딩하면 다음과 같다.- Shift_JIS - %83E%83B%83L%83y%83f%83B%83A
- EUC-JP - %A5%A6%A5%A3%A5%AD%A5%DA%A5%C7%A5%A3%A5%A2
- UTF-8 - %E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2
참조
[1]
문서
RFC 1738 §2.2; RFC 2396 §2.4; RFC 3986 §1.2.1, 2.1, 2.5
[2]
웹사이트
rejected
http://www.w3.org/In[...]
[3]
웹사이트
ECMAScript 2017 Language Specification (ECMA-262, 8th edition, June 2017)
https://www.ecma-int[...]
Ecma International
2018-06-20
[4]
문서
User-agent support for email based HTML form submission, using a 'mailto' URL as the form action, was proposed in RFC 1867 section 5.6, during the HTML 3.2 era. Various web browsers implemented it by invoking a separate email program or using their own rudimentary SMTP capabilities. Although sometimes unreliable, it was briefly popular as a simple way to transmit form data without involving a web server or CGI scripts.
[5]
간행물
RFC 1630
https://tools.ietf.o[...]
IETF
1994-06
[6]
문서
Harvnb
url-standard
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com